home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1995 October / EnigmA AMIGA RUN 01 (1995)(G.R. Edizioni)(IT)[!][issue 1995-10][Aminet 7].iso / Aminet / misc / math / gpamiga_1_38_3.lha / amiga / plotAmiga.c < prev    next >
C/C++ Source or Header  |  1993-11-10  |  18KB  |  853 lines

  1. /*plot.amiga for amiga version of PARI, based on plot.sun          */
  2.  
  3.  
  4. /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
  5. /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
  6. /*                                                                 */
  7. /*                     PLOT EN HAUTE RESOLUTION                    */
  8. /*                                                                 */
  9. /*                       copyright Babe Cool                       */
  10. /*                                                                 */
  11. /*                                                                 */
  12. /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
  13. /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
  14.  
  15. # include "genpari.h"
  16.  
  17.  
  18.  
  19. #include <exec/types.h>
  20. #include <intuition/intuition.h>
  21. #include <graphics/gfxmacros.h>
  22. #include <string.h>
  23.  
  24. typedef struct spoint {
  25.   int x,y;} SPoint;
  26. typedef struct ssegment {
  27.   int x1,y1,x2,y2;} SSegment;
  28. typedef struct srectangle {
  29.   int x,y,width,height;} SRectangle;
  30.  
  31. long GfxBase;
  32.  
  33. #undef ISCR
  34. #undef JSCR     
  35. #define ISCR 640 /* hires width*/
  36. #define JSCR 400  /* hires height*/
  37. #define DECI 50  /* 140 en haute resolution  */
  38. #define DECJ 25  /* 70 en haute resolution   */
  39. #define IDEC 5
  40. #define JDEC 10
  41.  
  42.  
  43.  
  44. GEN  ploth(entree *ep,GEN a,GEN b,char *ch, long prec)
  45.  
  46.  
  47.  
  48. {
  49.  
  50. struct IntuiMessage *msg;
  51.  
  52. struct TextAttr myfont =
  53.  
  54. {
  55.     (STRPTR)"topaz.font", 8 , 0 , 0
  56. };
  57.  
  58. struct NewScreen myscreen1 =
  59. {
  60.     0, 0,
  61.     650, 420,
  62.     2,
  63.     1,2,
  64.     HIRES | LACE,
  65.     CUSTOMSCREEN,
  66.     NULL,/*(struct TextAttr *)&myfont,*/
  67.     (UBYTE *)"ploth",
  68.     NULL,
  69.     NULL
  70.  
  71. };
  72.  
  73. struct NewWindow myWindow =
  74.  
  75. {    
  76.     0,
  77.  
  78.     5,
  79.     640,410,
  80.     -1,
  81.     -1,
  82.     
  83.     CLOSEWINDOW ,/* | REFRESHWINDOW ,*/
  84.  
  85.     SMART_REFRESH | WINDOWCLOSE  | WINDOWDRAG,
  86.  
  87.  
  88.  
  89.     NULL,
  90.  
  91.     NULL,
  92.  
  93.     (UBYTE *)"PLOTH",
  94.  
  95.     NULL,
  96.     NULL,
  97.     10, 10,
  98.  
  99.     640, 400,
  100.  
  101.     CUSTOMSCREEN
  102.  
  103. };
  104.  
  105.   long av,av2,j,j1,i,sig,is,is2,js,js2;
  106.   GEN p1,p2,p3,p4,ysml,ybig,x,diff,dyj,dx,y[ISCR+1];
  107.   short h, iz=0, jz = 0, ordonnee[ISCR+1];
  108.   char c1[20], c2[20], c3[20], c4[20];
  109.  
  110.   struct Screen *s, *OpenScreen();
  111.   struct Window *w, *OpenWindow();
  112.   struct RastPort *rp;
  113.  
  114.   GfxBase=OpenLibrary("graphics.library",0);
  115.   if(!GfxBase )
  116.     { printf("can not open graphics.library\n");
  117.       return(gnil);
  118.     }
  119.  
  120.   is=ISCR-DECI;js=JSCR-DECJ;is2=is-DECI;js2=js-DECJ; 
  121.  
  122.   sig=gcmp(b,a); if(!sig) return gnil;
  123.   av=avma;
  124.   if(sig<0) {x=a;a=b;b=x;}
  125.  
  126.   for(i=1;i<=is2;i++) y[i]=cgetr(3);
  127.   newvalue(ep,cgetr(prec)); x=(GEN)ep->value; 
  128. /*printf("gaffect 1\n");*/
  129.   gaffect(a,x);
  130.   dx=gdivgs(gsub(b,a),is2-1);ysml=gzero;ybig=gzero;
  131.   av2=avma;
  132.   for(i=1;i<=is2;i++)
  133.   {
  134.  
  135. /*printf("gaffect %d\n",i);*/
  136.     gaffect(lisexpr(ch),y[i]);
  137.     if(gcmp(y[i],ysml)<0) ysml=y[i];
  138.     if(gcmp(y[i],ybig)>0) ybig=y[i];
  139.     gaddz(x,dx,x);avma=av2;
  140.   }
  141.   diff=gsub(ybig,ysml);
  142.   if(gcmp0(diff)) {ybig=gaddsg(1,ybig);diff=gun;}
  143.   dyj=gdivsg(js2-1,diff);av2=avma;
  144.  
  145.   for(i = 1; i <= is2; i++)
  146.   {
  147.     ordonnee[i] = DECJ+itos(ground(gmul(gsub(ybig, y[i]),dyj)));
  148.     avma=av2;
  149.   }
  150.  
  151.   if(gsigne(ybig)*gsigne(ysml)<0) jz=
  152.         DECJ + itos(ground(gmul(ybig,dyj)));
  153.  
  154.   if(gsigne(a)*gsigne(b)<0) iz=
  155.     DECI + itos(ground(gmulsg(is2, gdiv(a, gsub(a, b)))));
  156.  
  157.   p1=cgetr(4); gaffect(ybig,p1); sprintf(c1," %9.3lf ",rtodbl(p1));
  158.   p2=cgetr(4); gaffect(ysml,p2); sprintf(c2," %9.3lf ",rtodbl(p2));
  159.   p3=cgetr(4); gaffect(a,p3); sprintf(c3," %9.3lf ",rtodbl(p3));
  160.   p4=cgetr(4); gaffect(b,p4); sprintf(c4," %9.3lf ",rtodbl(p4));
  161. /*printf("%s %s %s %s\n",c1,c2,c3,c4);*/
  162.  
  163.  
  164.   s=OpenScreen(&myscreen1);
  165.   myWindow.Screen=s;
  166.  
  167.   w=OpenWindow(&myWindow);
  168. if(w==0 | s==0){printf("can not open window or screen\n");
  169.       if(w) CloseWindow(w);
  170.       if(s) CloseScreen(s);
  171.  
  172.       avma = av;
  173.  
  174.       killvalue(ep);
  175.       return gnil;
  176.     }
  177.   rp=w->RPort;
  178.   SetDrMd(rp,JAM1);
  179.   SetAPen(rp,1);
  180. /******Draw the box and axes***/
  181.   Move(rp,DECI,DECJ);Draw(rp,DECI,js);
  182.   Move(rp,DECI,DECJ);Draw(rp,is,DECJ);
  183.   Move(rp,is,DECJ);Draw(rp,is,js);
  184.   Move(rp,DECI,js);Draw(rp,is,js);
  185.  
  186.   if(iz) {Move(rp,iz,js);Draw(rp,iz,DECJ);}
  187.  
  188.   if(jz) {Move(rp,is,jz);Draw(rp,DECI,jz);}
  189.  
  190.   Move(rp,-25,DECJ); Text(rp,c1,strlen(c1));
  191.   Move(rp,-25,js); Text(rp,c2,strlen(c2));
  192.   Move(rp,DECI-30,js+20); Text(rp,c3,strlen(c3));
  193.   Move(rp,is2,js+20); Text(rp,c4,strlen(c4));
  194.   Move(rp,DECI,ordonnee[1]);
  195.   for (i = 1, h = 0; i <= is2; i++) Draw(rp,++h + DECI, ordonnee[i]);
  196.  
  197.     while(1)
  198.     {
  199.             WaitPort(w->UserPort);
  200.         msg=(struct IntuiMessage *)GetMsg(w->UserPort);
  201.         if(msg->Class == CLOSEWINDOW) break;
  202.     }
  203.  
  204.   CloseWindow(w);
  205.   CloseScreen(s);
  206.  
  207.   avma = av;
  208.  
  209.   killvalue(ep);
  210.   return gnil;
  211. }
  212.  
  213. GEN  ploth2(ep,a,b,ch,prec)
  214.      entree *ep;
  215.      GEN a,b;
  216.      char *ch;
  217.      long prec;
  218.  
  219.  
  220.  
  221.  
  222.  
  223.  
  224. {
  225.  
  226. struct IntuiMessage *msg;
  227.  
  228. struct TextAttr myfont =
  229.  
  230. {
  231.     (STRPTR)"topaz.font", 8 , 0 , 0
  232. };
  233.  
  234. struct NewScreen myscreen1 =
  235. {
  236.     0, 0,
  237.     650, 420,
  238.     2,
  239.     1,2,
  240.     HIRES | LACE,
  241.     CUSTOMSCREEN,
  242.     NULL,/*(struct TextAttr *)&myfont,*/
  243.     (UBYTE *)"ploth2",
  244.     NULL,
  245.     NULL
  246.  
  247. };
  248.  
  249. struct NewWindow myWindow =
  250.  
  251. {    
  252.     0,
  253.  
  254.     5,
  255.     640,410,
  256.     -1,
  257.     -1,
  258.     
  259.     CLOSEWINDOW  | REFRESHWINDOW ,
  260.  
  261.     SMART_REFRESH | WINDOWCLOSE  | WINDOWDRAG,
  262.  
  263.     NULL,
  264.  
  265.     NULL,
  266.  
  267.     (UBYTE *)"PLOTH2",
  268.  
  269.     NULL,
  270.     NULL,
  271.     10, 10,
  272.  
  273.     640, 400,
  274.  
  275.     CUSTOMSCREEN
  276.  
  277. };
  278.  
  279.   long av,av2,k,k1,j,j1,i,sig,is,is2,js,js2;
  280.   GEN p1,p2,p3,p4,ysml,ybig,xsml,xbig,diffx,diffy,dxj,t,dyj,dt,y[ISCR+1],x[ISCR+1];
  281.   short h, iz=0, jz = 0;
  282.   char c1[20], c2[20], c3[20], c4[20];
  283.  
  284.   struct Screen *s, *OpenScreen();
  285.   struct Window *w, *OpenWindow();
  286.   struct RastPort *rp;
  287.  
  288.   GfxBase=OpenLibrary("graphics.library",0);
  289.  
  290.  
  291.   is=ISCR-DECI;js=JSCR-DECJ;is2=is-DECI;js2=js-DECJ; 
  292.  
  293.   sig=gcmp(b,a); if(!sig) return gnil;
  294.   av=avma;
  295.   if(sig<0) {p1=a;a=b;b=p1;}
  296.  
  297.   for(i=1;i<=is2;i++) {x[i]=cgetr(3);y[i]=cgetr(3);}
  298.   newvalue(ep,cgetr(prec)); t=(GEN)ep->value; 
  299.   gaffect(a,t);
  300.   dt=gdivgs(gsub(b,a),is2-1);ysml=ybig=xsml=xbig=gzero;
  301.   av2=avma;
  302.   for(i=1;i<=is2;i++)
  303.   {
  304.     p1=lisexpr(ch);gaffect((GEN)p1[1],x[i]);gaffect((GEN)p1[2],y[i]);
  305.     if(gcmp(y[i],ysml)<0) ysml=y[i];
  306.     if(gcmp(y[i],ybig)>0) ybig=y[i];
  307.     if(gcmp(x[i],xsml)<0) xsml=x[i];
  308.     if(gcmp(x[i],xbig)>0) xbig=x[i];
  309.     gaddz(t,dt,t);avma=av2;
  310.   }
  311.   diffy=gsub(ybig,ysml);
  312.   if(gcmp0(diffy)) {ybig=gaddsg(1,ybig);diffy=gun;}
  313.   diffx=gsub(xbig,xsml);
  314.   if(gcmp0(diffx)) {xbig=gaddsg(1,xbig);diffx=gun;}
  315.   dyj=gdivsg(js2-1,diffy);jz=js+itos(ground(gmul(ysml,dyj)));
  316.   dxj=gdivsg(is2-1,diffx);iz=DECI-itos(ground(gmul(xsml,dxj)));
  317.  
  318.   if(gsigne(ybig)*gsigne(ysml)<0) jz=
  319.         DECJ + itos(ground(gmul(ybig,dyj)));
  320.  
  321.   if(gsigne(xsml)*gsigne(ysml)<0) iz=
  322.     DECI + itos(ground(gmulsg(is2, gdiv(a, gsub(a, b)))));
  323. /****************
  324.   for(i=1;i<=is2;i++)
  325.   {
  326.     ordonneey[i] = DECJ+itos(ground(gmul(gsub(ybig, y[i]),dyj)));
  327.     ordonneey[i] = DECI+itos(ground(gmul(gsub(x[i], xsml),dxj)));
  328.  
  329.   av2=avma;
  330.  
  331.   }
  332. ****************/
  333.   p1=cgetr(4); gaffect(ybig,p1); sprintf(c1," %9.3lf ",rtodbl(p1));
  334.   p2=cgetr(4); gaffect(ysml,p2); sprintf(c2," %9.3lf ",rtodbl(p2));
  335.   p3=cgetr(4); gaffect(xsml,p3); sprintf(c3," %9.3lf ",rtodbl(p3));
  336.   p4=cgetr(4); gaffect(xbig,p4); sprintf(c4," %9.3lf ",rtodbl(p4));
  337. /*printf("%s %s %s %s\n",c1,c2,c3,c4);*/
  338.  
  339.  
  340.   s=OpenScreen(&myscreen1);
  341.   myWindow.Screen=s;
  342.  
  343.   w=OpenWindow(&myWindow);
  344. if(w==0){printf("can not open window\n");
  345.       CloseScreen(s);
  346.  
  347.       avma = av;
  348.  
  349.       killvalue(ep);
  350.       return gnil;
  351.     }
  352.   rp=w->RPort;
  353.   SetDrMd(rp,JAM1);
  354.   SetAPen(rp,1);
  355.  
  356.   Move(rp,DECI,DECJ);Draw(rp,DECI,js);
  357.   Move(rp,DECI,DECJ);Draw(rp,is,DECJ);
  358.   Move(rp,is,DECJ);Draw(rp,is,js);
  359.   Move(rp,DECI,js);Draw(rp,is,js);
  360.  
  361.   if(iz) {Move(rp,iz,js);Draw(rp,iz,DECJ);}
  362.  
  363.   if(jz) {Move(rp,is,jz);Draw(rp,DECI,jz);}
  364.  
  365.   Move(rp,-25,DECJ); Text(rp,c1,strlen(c1));
  366.   Move(rp,-25,js); Text(rp,c2,strlen(c2));
  367.   Move(rp,DECI-30,js+20); Text(rp,c3,strlen(c3));
  368.   Move(rp,is2,js+20); Text(rp,c4,strlen(c4));
  369. /*  Move(rp,DECI,ordonnee[1]);*/
  370.   for (i = 1, h = 0; i <= is2; i++)
  371.   {
  372.  
  373.  
  374.     k1= DECJ+itos(ground(gmul(gsub(ybig, y[i]),dyj)));
  375.     j1= DECI+itos(ground(gmul(gsub(x[i], xsml),dxj)));
  376.     if(i==1) {Move(rp,j1,k1);}
  377.     else
  378.     {
  379.         Draw(rp,j1, k1);
  380.     }
  381.   }
  382.  
  383.     while(1)
  384.     {
  385.             WaitPort(w->UserPort);
  386.         msg=(struct IntuiMessage *)GetMsg(w->UserPort);
  387.         if(msg->Class == CLOSEWINDOW) break;        
  388.     }
  389.  
  390.   CloseWindow(w);
  391.   CloseScreen(s);
  392.  
  393.   avma = av;
  394.  
  395.   killvalue(ep);
  396.   return gnil;
  397. }
  398.  
  399.  
  400. _abort()
  401. {
  402. err(interrupter);
  403. }
  404.  
  405. GEN plothraw(listx,listy)
  406.     GEN listx, listy;
  407. {
  408.  
  409.  
  410.  
  411. struct IntuiMessage *msg;
  412.  
  413. struct TextAttr myfont =
  414.  
  415. {
  416.     (STRPTR)"topaz.font", 8 , 0 , 0
  417. };
  418.  
  419. struct NewScreen myscreen1 =
  420. {
  421.     0, 0,
  422.     650, 420,
  423.     2,
  424.     1,2,
  425.     HIRES | LACE,
  426.     CUSTOMSCREEN,
  427.     NULL,/*(struct TextAttr *)&myfont,*/
  428.     (UBYTE *)"plothraw",
  429.     NULL,
  430.     NULL
  431.  
  432. };
  433.  
  434. struct NewWindow myWindow =
  435.  
  436. {    
  437.     0,
  438.  
  439.     5,
  440.     640,410,
  441.     -1,
  442.     -1,
  443.     
  444.     CLOSEWINDOW ,/* | REFRESHWINDOW ,*/
  445.  
  446.     SMART_REFRESH | WINDOWCLOSE  | WINDOWDRAG,
  447.  
  448.  
  449.  
  450.     NULL,
  451.  
  452.     NULL,
  453.  
  454.     (UBYTE *)"PLOTHRAW",
  455.  
  456.     NULL,
  457.     NULL,
  458.     10, 10,
  459.  
  460.     640, 400,
  461.  
  462.     CUSTOMSCREEN
  463.  
  464. };
  465.  
  466.   long av=avma,av2,i,lx,sig,is,is2,js,js2;
  467.   SPoint *points;
  468.  
  469.  
  470.   GEN p1,p2,p3,p4,xsml,xbig,ysml,ybig,dx,dy,scal,scaly;
  471.   short h, iz=0, jz = 0, ordonnee[ISCR+1];
  472.   char c1[20], c2[20], c3[20], c4[20];
  473.  
  474.   struct Screen *s, *OpenScreen();
  475.   struct Window *w, *OpenWindow();
  476.   struct RastPort *rp;
  477.  
  478.   GfxBase=OpenLibrary("graphics.library",0);
  479.   if(!GfxBase )
  480.     { printf("can not open graphics.library\n");
  481.       return(gnil);
  482.     }
  483.  
  484.   if((typ(listx)<17)||(typ(listx)>18)||(typ(listy)<17)||(typ(listy)>18))
  485.     err(ploter4);
  486.   lx=lg(listx);
  487.   if(lg(listy)!=lx) err(ploter5);
  488.   if(lx==1) return gnil;
  489.   points = (SPoint*)malloc(lx*sizeof(SPoint));
  490.   if(!points) err(ploter6);
  491.   is=ISCR-IDEC-5;js=JSCR-JDEC-10;is2=is+IDEC;js2=js+JDEC;
  492.   av=avma;xsml=xbig=(GEN)listx[1];ysml=ybig=(GEN)listy[1];
  493. /************************
  494.   is=ISCR-DECI;js=JSCR-DECJ;is2=is-DECI;js2=js-DECJ; 
  495. ***************************/
  496.  
  497.   for(i = 0; i < lx-1; i++)
  498.     {
  499.       p1=(GEN)listx[i+1];
  500.       if(gcmp(p1,xsml)<0) xsml=p1;if(gcmp(p1,xbig)>0) xbig=p1;
  501.       p1=(GEN)listy[i+1];
  502.       if(gcmp(p1,ysml)<0) ysml=p1;if(gcmp(p1,ybig)>0) ybig=p1;
  503.     }
  504.   dx=gsub(xbig,xsml);dy=gsub(ybig,ysml);
  505.   if(gcmp0(dx))
  506.     {
  507.       if(gcmp0(dy))
  508.         {
  509.           scal=gun;dx=gsubsg(is>>1,xsml);
  510.           dy=gsubsg(js>>1,ysml);
  511.         }
  512.       else
  513.         {
  514.           scal=gdivsg(js,dy);
  515.           dx=gneg(gmul(scal,xsml));dy=gneg(gmul(scal,ysml));
  516.         }
  517.     }
  518.   else
  519.     {
  520.       scal=gdivsg(is,dx);
  521.       if(!gcmp0(dy))
  522.         {
  523.           scaly=gdivsg(js,dy);if(gcmp(scaly,scal)<0) scal=scaly;
  524.         }
  525.   
  526.       dx=gneg(gmul(scal,xsml));dy=gneg(gmul(scal,ybig));
  527.     }
  528.   for(i = 0; i < lx-1; i++)
  529.     {
  530.       av2=avma;
  531.       points[i].x = IDEC + itos(ground(gadd(gmul((GEN)listx[i+1],scal),dx)));
  532.       points[i].y = JDEC - itos(ground(gadd(gmul((GEN)listy[i+1],scal),dy)));
  533.       avma=av2;
  534.     }
  535. /********************
  536.   for(i=1;i<=is2;i++) y[i]=cgetr(3);
  537.   newvalue(ep,cgetr(3)); x=(GEN)ep->value; 
  538.  
  539.   gaffect(a,x);
  540.   dx=gdivgs(gsub(b,a),is2-1);ysml=gzero;ybig=gzero;
  541.   av2=avma;
  542. *****************************/
  543.  
  544. /*******************
  545.   for(i=1;i<=is2;i++)
  546.   {
  547.  
  548.  
  549.     gaffect(lisexpr(ch),y[i]);
  550.     if(gcmp(y[i],ysml)<0) ysml=y[i];
  551.     if(gcmp(y[i],ybig)>0) ybig=y[i];
  552.     gaddz(x,dx,x);avma=av2;
  553.   }
  554.   diff=gsub(ybig,ysml);
  555.   if(gcmp0(diff)) {ybig=gaddsg(1,ybig);diff=gun;}
  556.   dyj=gdivsg(js2-1,diff);av2=avma;
  557.  
  558.   for(i = 1; i <= is2; i++)
  559.   {
  560.     ordonnee[i] = DECJ+itos(ground(gmul(gsub(ybig, y[i]),dyj)));
  561.     avma=av2;
  562.   }
  563.  
  564.   if(gsigne(ybig)*gsigne(ysml)<0) jz=
  565.         DECJ + itos(ground(gmul(ybig,dyj)));
  566.  
  567.   if(gsigne(a)*gsigne(b)<0) iz=
  568.     DECI + itos(ground(gmulsg(is2, gdiv(a, gsub(a, b)))));
  569.  
  570.   p1=cgetr(4); gaffect(ybig,p1); sprintf(c1," %9.3lf ",rtodbl(p1));
  571.   p2=cgetr(4); gaffect(ysml,p2); sprintf(c2," %9.3lf ",rtodbl(p2));
  572.   p3=cgetr(4); gaffect(a,p3); sprintf(c3," %9.3lf ",rtodbl(p3));
  573.   p4=cgetr(4); gaffect(b,p4); sprintf(c4," %9.3lf ",rtodbl(p4));
  574. *************************************/
  575.  
  576.  
  577.   s=OpenScreen(&myscreen1);
  578.   myWindow.Screen=s;
  579.  
  580.   w=OpenWindow(&myWindow);
  581. if(w==0 | s==0){printf("can not open window or screen\n");
  582.       if(w) CloseWindow(w);
  583.       if(s) CloseScreen(s);
  584.  
  585.       avma = av;
  586.  
  587.       free(points);
  588.       return gnil;
  589.     }
  590.   rp=w->RPort;
  591.   SetDrMd(rp,JAM1);
  592.   SetAPen(rp,1);
  593. /******Draw the box and axes***/
  594.   Move(rp,IDEC,JDEC);Draw(rp,IDEC,js2);
  595.   Move(rp,IDEC,JDEC);Draw(rp,is2,JDEC);
  596.   Move(rp,is2,JDEC);Draw(rp,is2,js2);
  597.   Move(rp,IDEC,js2);Draw(rp,is2,js2);
  598. /*************************
  599.   if(iz) {Move(rp,iz,js);Draw(rp,iz,DECJ);}
  600.  
  601.   if(jz) {Move(rp,is,jz);Draw(rp,DECI,jz);}
  602.  
  603.  
  604.   Move(rp,-25,DECJ); Text(rp,c1,strlen(c1));
  605.   Move(rp,-25,js); Text(rp,c2,strlen(c2));
  606.   Move(rp,DECI-30,js+20); Text(rp,c3,strlen(c3));
  607.   Move(rp,is2,js+20); Text(rp,c4,strlen(c4));
  608.   Move(rp,DECI,ordonnee[1]);
  609.   for (i = 1, h = 0; i <= is2; i++) Draw(rp,++h + DECI, ordonnee[i]);
  610. ********************************/
  611.  
  612.  
  613.   for(i = 0; i < lx-1;i++)
  614.    WritePixel(rp,points[i].x,points[i].y);
  615.  
  616. /*  PolyDraw(rp,lx,points);*/
  617.     while(1)
  618.     {
  619.             WaitPort(w->UserPort);
  620.         msg=(struct IntuiMessage *)GetMsg(w->UserPort);
  621.         if(msg->Class == CLOSEWINDOW) break;
  622.     }
  623.  
  624.   CloseWindow(w);
  625.   CloseScreen(s);
  626.  
  627.   free(points);avma = av;
  628.   return gnil;
  629.  
  630.  
  631. }
  632.  
  633.  
  634. GEN rectdraw(list)
  635.     GEN list;
  636. {
  637. struct IntuiMessage *msg;
  638.  
  639. struct TextAttr myfont =
  640.  
  641. {
  642.     (STRPTR)"topaz.font", 8 , 0 , 0
  643. };
  644.  
  645. struct NewScreen myscreen1 =
  646. {
  647.     0, 0,
  648.     650, 420,
  649.     2,
  650.     1,2,
  651.     HIRES | LACE,
  652.     CUSTOMSCREEN,
  653.     NULL,/*(struct TextAttr *)&myfont,*/
  654.     (UBYTE *)"draw",
  655.     NULL,
  656.     NULL
  657.  
  658. };
  659.  
  660. struct NewWindow myWindow =
  661.  
  662. {    
  663.     0,
  664.  
  665.     5,
  666.     640,410,
  667.     -1,
  668.     -1,
  669.     
  670.     CLOSEWINDOW ,/* | REFRESHWINDOW ,*/
  671.  
  672.     SMART_REFRESH | WINDOWCLOSE  | WINDOWDRAG | GIMMEZEROZERO,
  673.  
  674.  
  675.  
  676.     NULL,
  677.  
  678.     NULL,
  679.  
  680.     (UBYTE *)"DRAW",
  681.  
  682.     NULL,
  683.     NULL,
  684.     10, 10,
  685.  
  686.     640, 400,
  687.  
  688.     CUSTOMSCREEN
  689.  
  690. };
  691.  
  692.   long *e,*p1,*ptx,*pty,*numpoints,*numtexts,*xtexts,*ytexts;
  693.   long n,i,j,x0,y0,av=avma;
  694.   long a,b,c,d,nd[10],ne;
  695.   char **texts;
  696.  
  697.   SPoint *points, **lines, *SLine;
  698.   SSegment *segments;
  699.   SRectangle *rectangles, SRec;
  700.  
  701.  
  702.   struct Screen *s, *OpenScreen();
  703.   struct Window *w, *OpenWindow();
  704.   struct RastPort *rp;
  705.  
  706.   GfxBase=OpenLibrary("graphics.library",0);
  707.   if(!GfxBase )
  708.         { printf("can not open graphics.library\n");
  709.           return(gnil);
  710.         }
  711.  
  712.  
  713.   if(typ(list)!=17) err(rploter3);
  714.   n=lg(list)-1;if(n%3) err(rploter4);
  715.   n=n/3;if(!n) return gnil;
  716.   nd[0]=nd[1]=nd[2]=nd[3]=nd[4]=nd[5]=nd[6]=0;
  717.   for(i=0;i<n;i++)
  718.     {
  719.       if(typ((GEN)list[3*i+1])!=1) err(rploter5);
  720.       ne=itos((GEN)list[3*i+1]);if((ne<0)||(ne>15)) err(rploter2);
  721.       e=rectgraph[ne];
  722.       p1=(long*)e[0];while((long)p1)
  723.         {
  724.           if(p1[1]!=4) nd[p1[1]]++;
  725.           else nd[1]+=p1[2];
  726.           p1=(long*)p1[0];
  727.         }
  728.     }
  729.  
  730.   points=(SPoint*)malloc(nd[1]*sizeof(SPoint));
  731.   segments=(SSegment*)malloc(nd[2]*sizeof(SSegment));
  732.   rectangles=(SRectangle*)malloc(nd[3]*sizeof(SRectangle));
  733.   lines=(SPoint**)malloc(nd[5]*sizeof(SPoint*));
  734.   numpoints=(long*)malloc(nd[5]*sizeof(long));
  735.   texts=(char**)malloc(nd[6]*sizeof(char*));
  736.   numtexts=(long*)malloc(nd[6]*sizeof(long));
  737.   xtexts=(long*)malloc(nd[6]*sizeof(long));
  738.   ytexts=(long*)malloc(nd[6]*sizeof(long));
  739.   nd[1]=nd[2]=nd[3]=nd[5]=nd[6]=0;
  740.  
  741.   for(i=0;i<n;i++)
  742.     {
  743.       e=rectgraph[itos((GEN) list[3*i+1])];x0=list[3*i+2];y0=list[3*i+3];
  744.     
  745.       if((typ((GEN)x0)!=1)||(typ((GEN)y0)!=1)) err(rploter5);
  746.       x0=itos((GEN)x0);y0=itos((GEN)y0);
  747.       p1=(long*)e[0];
  748.       while((long)p1)
  749.         {
  750.           switch(p1[1])
  751.             {
  752.             case 1:
  753.               points[nd[1]].x=p1[2]+x0;
  754.               points[nd[1]].y=p1[3]+y0;
  755.               nd[1]++;break;
  756.             case 2:
  757.               segments[nd[2]].x1=p1[2]+x0;
  758.               segments[nd[2]].y1=p1[3]+y0;
  759.               segments[nd[2]].x2=p1[4]+x0;
  760.               segments[nd[2]].y2=p1[5]+y0;
  761.               nd[2]++;break;
  762.             case 3:
  763.               a=rectangles[nd[3]].x=p1[2]+x0;
  764.               b=rectangles[nd[3]].y=p1[3]+y0;
  765.               rectangles[nd[3]].width=p1[4]+x0-a;
  766.               rectangles[nd[3]].height=p1[5]+y0-b;
  767.               nd[3]++;break;
  768.             case 4:
  769.               ptx=(long*)p1[3];pty=(long*)p1[4];
  770.               for(j=0;j<p1[2];j++)
  771.                 {
  772.                   points[nd[1]+j].x=ptx[j]+x0;
  773.                   points[nd[1]+j].y=pty[j]+y0;
  774.                 }
  775.               nd[1]+=p1[2];break;
  776.             case 5:
  777.               ptx=(long*)p1[3];pty=(long*)p1[4];
  778.               numpoints[nd[5]]=p1[2];
  779.               lines[nd[5]]=(SPoint*)malloc(p1[2]*sizeof(SPoint));
  780.               for(j=0;j<p1[2];j++)
  781.                 {
  782.                   lines[nd[5]][j].x=ptx[j]+x0;
  783.                   lines[nd[5]][j].y=pty[j]+y0;
  784.                 }
  785.               nd[5]++;break;
  786.             case 6:
  787.               texts[nd[6]]=(char*)p1[3];numtexts[nd[6]]=p1[2];
  788.               xtexts[nd[6]]=p1[4]+x0;ytexts[nd[6]]=p1[5]+y0;
  789.               nd[6]++;break;
  790.             default: break;
  791.             }
  792.           p1=(long*)p1[0];
  793.         }
  794.     }
  795.  
  796.   s=OpenScreen(&myscreen1);
  797.   myWindow.Screen=s;
  798.  
  799.   w=OpenWindow(&myWindow);
  800. if(w==0 | s==0){printf("can not open window or screen\n");
  801.       if(w) CloseWindow(w);
  802.       if(s) CloseScreen(s);
  803.  
  804.       avma = av;
  805.  
  806.  
  807.       free(points);free(segments);free(rectangles);
  808.       free(numpoints);for(i=0;i<nd[5];i++) free(lines[i]);
  809.       free(lines);free(texts);free(numtexts);free(xtexts);free(ytexts);
  810.       return gnil;
  811.     }
  812.   rp=w->RPort;
  813.   SetDrMd(rp,JAM1);
  814.   SetAPen(rp,1);
  815.   for(i=0;i<nd[1];i++) WritePixel(rp,points[i].x,points[i].y);
  816.   for(i=0;i<nd[2];i++) {Move(rp,segments[i].x1,segments[i].y1);
  817.                Draw(rp,segments[i].x2,segments[i].y2);}
  818.   for(i=0;i<nd[3];i++)
  819.     {
  820.       SRec=rectangles[i];a=SRec.x;b=SRec.y;c=a+SRec.width;
  821.       d=b+SRec.height;
  822. /*printf("%d %d %d %d\n",a,b,c,d);     */
  823.     Move(rp,a,b);
  824.     Draw(rp,c,b);Draw(rp,c,d);Draw(rp,a,d);Draw(rp,a,b);
  825.     }
  826.   for(i=0;i<nd[5];i++)
  827.     {
  828.       SLine=lines[i];
  829.       Move(rp,SLine[0].x,SLine[0].y);
  830.       for(j=1;j<numpoints[i];j++)
  831.         Draw(rp,SLine[j].x,SLine[j].y);
  832.     }
  833.   for(i=0;i<nd[6];i++)
  834.       {    Move(rp,xtexts[i],ytexts[i]);      
  835.          Text(rp,texts[i],strlen(texts[i]));
  836.       }
  837.  
  838.     while(1)
  839.     {
  840.             WaitPort(w->UserPort);
  841.         msg=(struct IntuiMessage *)GetMsg(w->UserPort);
  842.         if(msg->Class == CLOSEWINDOW) break;
  843.     }
  844.  
  845.   CloseWindow(w);
  846.   CloseScreen(s);
  847.   free(points);free(segments);free(rectangles);
  848.   free(numpoints);for(i=0;i<nd[5];i++) free(lines[i]);
  849.   free(lines);free(texts);free(numtexts);free(xtexts);free(ytexts);
  850.   avma = av;return gnil;
  851.  
  852. }
  853.